﻿//99. 恢复二叉搜索树
//给你二叉搜索树的根节点 root ，该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下，恢复这棵树 。
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void func2(vector<TreeNode*>& arr)
    {
        int begin = 0, end = arr.size() - 1;
        while (begin < end)
        {
            if (arr[begin]->val > arr[begin + 1]->val)
            {
                if (arr[end]->val < arr[end - 1]->val)
                {
                    swap(arr[end]->val, arr[begin]->val);
                    return;
                }
                else
                {
                    end--;
                }
            }
            else
            {
                begin++;
            }
        }
    }
    void func1(vector<TreeNode*>& vec, TreeNode* root)
    {
        if (!root)
            return;
        func1(vec, root->left);
        vec.push_back(root);
        func1(vec, root->right);
    }
    void recoverTree(TreeNode* root)
    {
        vector<TreeNode*> vec;
        func1(vec, root);
        func2(vec);
    }
};